package com.cuotigou.util;

import com.cuotigou.config.ConfigUtils;
import com.cuotigou.mapper.SUserToWrongTopicMapper;
import com.cuotigou.mapper.SWrongTopicMapper;

import com.cuotigou.pojo.SWrongTopic;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.ElementList;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFile;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliers;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.ElementHandlerPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import org.apache.commons.lang3.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * Created by Administrator on 2019/1/3.
 */
@Service
public class wordUtil {

    private static Logger LOG = LoggerFactory.getLogger(wordUtil.class);

    @Autowired
    private SUserToWrongTopicMapper sUserToWrongTopicMapper;
    @Autowired
    private SWrongTopicMapper sWrongTopicMapper;

    /**
     * 导出word
     *
     * @param titleStr 标题
     * @param content  内容
     * @param image    图片
     * @return
     * @throws Exception
     */
    public String exportDoc(String titleStr, List<SWrongTopic> list, String userId) throws Exception {

        // 设置纸张大小
        Document document = new Document();
        // 建立一个书写器(Writer)与document对象关联，通过书写器(Writer)可以将文档写入到磁盘中
        // ByteArrayOutputStream baos = new ByteArrayOutputStream();
        String fileName = System.currentTimeMillis() + ".pdf";//文件名
        String path = ConfigUtils.WORD_URL + fileName;//文件路径
        File file = new File(path);
//        RtfWriter2.getInstance(document, new FileOutputStream(file));
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        // 设置中文字体
        //中文字体,解决中文不能显示问题
        BaseFont bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfChinese);//正常字体
        Font fontBold = new Font(bfChinese, 12, Font.BOLD);//正常加粗字体
        Font fontBig = new Font(bfChinese, 20);//大字体
        Font fontBigBold = new Font(bfChinese, 20, Font.BOLD);//加粗大字体

        Paragraph title = new Paragraph(titleStr, fontBig);
        // 设置标题格式对齐方式
        title.setAlignment(Element.ALIGN_CENTER);

        // title.setFont(titleFont);
        document.add(title);

//        String contextString = "iText是一个能够快速产生PDF文件的java类库。"
//
//                + " \n"// 换行 + "iText的java类对于那些要产生包含文本，"
//
//                + "表格，图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。"
//
//                + "使用iText与PDF能够使你正确的控制Servlet的输出。";

        for (int i = 0; i < list.size(); i++) {
            int k = i + 1;
            SWrongTopic sWrongTopic = list.get(i);
            if (sWrongTopic.getType() == 2) {
                Paragraph context = new Paragraph("("+k+")" + StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getStem())), font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context);
                String answer = StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getAnswer() == null ? "" : sWrongTopic.getAnswer()));
                Paragraph context2 = new Paragraph("  答案:" + answer, font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context2);

                String remark = StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getRemark() == null ? "" : sWrongTopic.getRemark()));
                Paragraph context3 = new Paragraph("  备注:" + remark, font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context3);
            }
//            if (sWrongTopic.getType()==1){
//                String[] split = sWrongTopic.getStem().split(",");
//                StringBuilder builder = new StringBuilder();
//
//                for (int j = 0;j<split.length;j++){
//                    String replaceAll = split[j].replaceAll(ConfigUtils.FILE_URL, "C:/tomcat8088/webapps/");
//                    LOG.info("replaceAll:"+replaceAll);
//                    String str = OcrUtil.generalRecognition(replaceAll);
//                    builder.append(str);
//                }
//
//                Paragraph context = new Paragraph(k+". "+builder.toString());
//                // 正文格式左对齐
//                context.setAlignment(Element.ALIGN_LEFT);
//                // context.setFont(contextFont);
//                // 离上一段落（标题）空的行数
//                context.setSpacingBefore(5);
//                // 设置第一行空的列数
//                context.setFirstLineIndent(20);
//                document.add(context);
//            }

            //
            // // 利用类FontFactory结合Font和Color可以设置各种各样字体样式
            //
            // Paragraph underline = new Paragraph("下划线的实现", FontFactory.getFont(
            // FontFactory.HELVETICA_BOLDOBLIQUE, 18, Font.UNDERLINE,
            // new Color(0, 0, 255)));
            //
            // document.add(underline);
            //

            // // 添加图片 Image.getInstance即可以放路径又可以放二进制字节流
            //

            if (sWrongTopic.getType() == 1) {
                Paragraph context = new Paragraph("("+k+")");
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context);

                Paragraph context2 = new Paragraph("  题干:", font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context2);

                String[] split = sWrongTopic.getStem().split(",");
                for (int j = 0; j < split.length; j++) {
                    Image img = Image.getInstance(split[j]);
//                    img.setAbsolutePosition(0, 0+j*70);
                    img.setAlignment(Image.LEFT);// 设置图片显示位置
                    //
//                     img.scaleAbsolute(60, 60);// 直接设定显示尺寸
                    //
                    img.scalePercent(50);//表示显示的大小为原尺寸的50%
                    //
                    // // img.scalePercent(25, 12);//图像高宽的显示比例
                    //
                    // // img.setRotation(30);//图像旋转一定角度
                    //
                    document.add(img);
                }

                Paragraph context3 = new Paragraph("  答案:", font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context3);
                if (!StringUtil.isEmpty(sWrongTopic.getAnswer())) {
                    String[] split3 = sWrongTopic.getAnswer().split(",");
                    for (int j = 0; j < split3.length; j++) {
                        Image img = Image.getInstance(split3[j]);
//                        img.setAbsolutePosition(0, 0+j*70);
                        img.setAlignment(Image.LEFT);// 设置图片显示位置
                        //
                        // img.scaleAbsolute(60, 60);// 直接设定显示尺寸
                        //
                        img.scalePercent(50);//表示显示的大小为原尺寸的50%
                        //
                        // // img.scalePercent(25, 12);//图像高宽的显示比例
                        //
                        // // img.setRotation(30);//图像旋转一定角度
                        //
                        document.add(img);
                    }
                }

                String remark = StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getRemark() == null ? "" : sWrongTopic.getRemark()));
                Paragraph context4 = new Paragraph("  备注:" + remark, font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context4);

                Paragraph context5 = new Paragraph("  原图:", font);
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context5);

                if (!StringUtil.isEmpty(sWrongTopic.getOriginal())) {
                    String[] split2 = sWrongTopic.getOriginal().split(",");
                    for (int j = 0; j < split2.length; j++) {
                        Image img = Image.getInstance(split2[j]);
//                        img.setAbsolutePosition(0, 0+j*70);
                        img.setAlignment(Image.LEFT);// 设置图片显示位置
                        //
                        // img.scaleAbsolute(60, 60);// 直接设定显示尺寸
                        //
                        img.scalePercent(50);//表示显示的大小为原尺寸的50%
                        //
                        // // img.scalePercent(25, 12);//图像高宽的显示比例
                        //
                        // // img.setRotation(30);//图像旋转一定角度
                        //
                        document.add(img);
                    }
                }
            }
        }

        document.close();
        // 得到输入流
        // wordFile = new ByteArrayInputStream(baos.toByteArray());
        // baos.close();
        writer.close();
        return ConfigUtils.FILE_URL + "word/" + fileName;

    }

    //导出pdf
    public String exportPdf(String titleStr, List<SWrongTopic> list, String userId) throws Exception {

        // 设置纸张大小
        Document document = new Document();
        // 建立一个书写器(Writer)与document对象关联，通过书写器(Writer)可以将文档写入到磁盘中
        // ByteArrayOutputStream baos = new ByteArrayOutputStream();
        String fileName = System.currentTimeMillis() + ".pdf";//文件名
        String path = ConfigUtils.WORD_URL + fileName;//文件路径
        File file = new File(path);
//        RtfWriter2.getInstance(document, new FileOutputStream(file));
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        // 设置中文字体
        //中文字体,解决中文不能显示问题
        BaseFont bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfChinese);//正常字体
        Font fontBold = new Font(bfChinese, 12, Font.BOLD);//正常加粗字体
        Font fontBig = new Font(bfChinese, 20);//大字体
        Font fontBigBold = new Font(bfChinese, 20, Font.BOLD);//加粗大字体

        Paragraph title = new Paragraph(titleStr, fontBig);
        // 设置标题格式对齐方式
        title.setAlignment(Element.ALIGN_CENTER);
        document.add(title);

        Paragraph context8 = new Paragraph("题干", fontBold);
        // 正文格式左对齐
        context8.setAlignment(Element.ALIGN_LEFT);
        // context.setFont(contextFont);
        // 离上一段落（标题）空的行数
        context8.setSpacingBefore(5);
        // 设置第一行空的列数
        context8.setFirstLineIndent(20);
        document.add(context8);

        for (int i = 0; i < list.size(); i++) {
            int k = i + 1;
            SWrongTopic sWrongTopic = list.get(i);
            if (sWrongTopic.getType() == 2) {

                Paragraph context = new Paragraph("("+k+")");
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);

                ElementList elements = parseToElementList(StringEscapeUtils.unescapeHtml4(sWrongTopic.getStem()), null);
                for (Element element : elements) {
                    context.add(element);
                }

                document.add(context);
            }

            if (sWrongTopic.getType() == 1) {
                Paragraph context = new Paragraph("("+k+")");
                // 正文格式左对齐
                context.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context);

                String[] split = sWrongTopic.getStem().split(",");
                for (int j = 0; j < split.length; j++) {
                    Image img = Image.getInstance(split[j]);
                    img.setAlignment(Image.LEFT);// 设置图片显示位置
                    img.scalePercent(50);//表示显示的大小为原尺寸的50%
                    document.add(img);
                }

            }
        }

        Paragraph context = new Paragraph("答案", fontBold);
        // 正文格式左对齐
        context.setAlignment(Element.ALIGN_LEFT);
        // context.setFont(contextFont);
        // 离上一段落（标题）空的行数
        context.setSpacingBefore(5);
        // 设置第一行空的列数
        context.setFirstLineIndent(20);
        document.add(context);


        for (int i = 0; i < list.size(); i++) {
            int k = i + 1;
            SWrongTopic sWrongTopic = list.get(i);
            if (sWrongTopic.getType() == 2) {
                Paragraph context2 = new Paragraph("("+k+")", font);
                // 正文格式左对齐
                context2.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context2.setSpacingBefore(5);
                // 设置第一行空的列数
                context2.setFirstLineIndent(20);
                document.add(context2);

                Paragraph context4 = new Paragraph("  答案：" + StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getAnswer())), font);
                // 正文格式左对齐
                context4.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context4.setSpacingBefore(5);
                // 设置第一行空的列数
                context4.setFirstLineIndent(20);
                document.add(context4);

                String remark = StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getRemark() == null ? "" : sWrongTopic.getRemark()));
                Paragraph context3 = new Paragraph("  备注:" + remark, font);
                // 正文格式左对齐
                context3.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context3.setSpacingBefore(5);
                // 设置第一行空的列数
                context.setFirstLineIndent(20);
                document.add(context3);
            }


            if (sWrongTopic.getType() == 1) {
                Paragraph context2 = new Paragraph("("+k+")");
                // 正文格式左对齐
                context2.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context2.setSpacingBefore(5);
                // 设置第一行空的列数
                context2.setFirstLineIndent(20);
                document.add(context2);

                Paragraph context4 = new Paragraph("  答案:", font);
                // 正文格式左对齐
                context4.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context4.setSpacingBefore(5);
                // 设置第一行空的列数
                context4.setFirstLineIndent(20);
                document.add(context4);

                if (!StringUtil.isEmpty(sWrongTopic.getAnswer())) {
                    String[] split3 = sWrongTopic.getAnswer().split(",");
                    for (int j = 0; j < split3.length; j++) {
                        Image img = Image.getInstance(split3[j]);
                        img.setAlignment(Image.LEFT);// 设置图片显示位置
                        img.scalePercent(50);//表示显示的大小为原尺寸的50%
                        document.add(img);
                    }
                }

                String remark = StringUtil.getTextFromTHML(StringEscapeUtils.unescapeHtml4(sWrongTopic.getRemark() == null ? "" : sWrongTopic.getRemark()));
                Paragraph context5 = new Paragraph("  备注:" + remark, font);
                // 正文格式左对齐
                context5.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context5.setSpacingBefore(5);
                // 设置第一行空的列数
                context5.setFirstLineIndent(20);
                document.add(context5);

                Paragraph context6 = new Paragraph("  原图:", font);
                // 正文格式左对齐
                context6.setAlignment(Element.ALIGN_LEFT);
                // context.setFont(contextFont);
                // 离上一段落（标题）空的行数
                context6.setSpacingBefore(5);
                // 设置第一行空的列数
                context6.setFirstLineIndent(20);
                document.add(context6);

                if (!StringUtil.isEmpty(sWrongTopic.getOriginal())) {
                    String[] split2 = sWrongTopic.getOriginal().split(",");
                    for (int j = 0; j < split2.length; j++) {
                        Image img = Image.getInstance(split2[j]);
                        img.setAlignment(Image.LEFT);// 设置图片显示位置
                        img.scalePercent(50);//表示显示的大小为原尺寸的50%
                        document.add(img);
                    }
                }
            }
        }

        document.close();
        writer.close();
        return ConfigUtils.FILE_URL + "word/" + fileName;
    }


    public static ElementList parseToElementList(String html, String css) throws IOException {

        CSSResolver cssResolver = new StyleAttrCSSResolver();
        if (css != null) {
            CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));
            cssResolver.addCss(cssFile);
        }
        // HTML
        MyFontsProvider fontProvider = new MyFontsProvider();
        CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);//这里可以下手对字体进行操作
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
        htmlContext.autoBookmark(false);

        // Pipelines
        ElementList elements = new ElementList();
        ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
        HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);
        CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);

        // XML Worker
        XMLWorker worker = new XMLWorker(cssPipeline, true);
        XMLParser p = new XMLParser(worker);
        p.parse(new ByteArrayInputStream(html.getBytes()));

        return elements;
    }


    public static class MyFontsProvider extends XMLWorkerFontProvider {
        public MyFontsProvider() {
            super(null, null);
        }

        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {

            String fntname = fontname;
            if (fntname == null) {
                fntname = "宋体";
            }
            return super.getFont(fntname, encoding, size, style);
        }
    }

}
